﻿//using System;
//using System.Diagnostics;
//using System.IO;
//using System.Runtime.InteropServices;
//using System.Threading;
//using System.Windows.Forms;
//using fastJSON;
//using ServiceStack.Text;
//using WebKit;

//namespace RSuite
//{
//    public class WebKitForm : WebKitBrowser
//    {
//        public WebKitForm(string url)
//            : base()
//        {
//            this.NavigateLocal(url);
//            base.ObjectForScripting = this;
//        }

//        public Form CreateForm()
//        {
//            base.Dock = DockStyle.Fill;

//            var form = new Form();
//            form.Controls.Add(this);

//            this.InitForm(form);

//            return form;
//        }

//        protected virtual void InitForm(Form form) { }

//        public string ToJSON(object obj)
//        {
//            return JsonSerializer.SerializeToString(obj);
//        }

//        public dynamic FromJSON(string json)
//        {
//            return JSON.Instance.Parse(json);
//        }

//        public void NavigateLocal(string relative)
//        {
//            var file = new FileInfo(relative);
//            base.Navigate(new Uri(file.FullName).AbsoluteUri);
//        }

//        public string InvokeMethod(string method, string parameters, string id)
//        {
//            var data = this.FromJSON(parameters);

//            if (string.IsNullOrEmpty(id))
//            {
//                var result = this.InvokeLocalMethod(method, data, id);
//                if (result == null)
//                {
//                    return this.ToJSON(this.InvokeCommonMethod(method, data));
//                }
//                else
//                {
//                    return this.ToJSON(result);
//                }
//            }
//            else
//            {
//                ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object d)
//                {
//                    var result = this.InvokeLocalMethod(method, data, id);
//                    this.JobDone(id, result);
//                }));
//                return string.Empty;
//            }
//        }

//        protected virtual object InvokeLocalMethod(string method, dynamic data, string id)
//        {
//            return null;
//        }

//        protected virtual object InvokeCommonMethod(string method, dynamic data)
//        {
//            switch (method)
//            {
//                case "alert":
//                    return this.Alert(data);
//                case "browse-dialog":
//                    return this.BrowseDialog(data);
//                case "open-folder":
//                    Process.Start(data);
//                    return string.Empty;
//                case "open-file":
//                    Process.Start("explorer.exe", string.Format("/select,\"{0}\"", data));
//                    return string.Empty;
//                default:
//                    return string.Empty;
//            }
//        }

//        public string Alert(string message)
//        {
//            MessageBox.Show(message);
//            return string.Empty;
//        }

//        private object BrowseDialog(string path)
//        {
//            var dialog = new FolderBrowserDialog();
//            dialog.SelectedPath = path;
//            if (this.ShowDialog(dialog) != DialogResult.OK)
//            {
//                return string.Empty;
//            }

//            return new { selectedPath = dialog.SelectedPath };
//        }

//        private delegate void JobDoneDelegate(string id, object data);
//        protected void JobDone(string id, object data)
//        {
//            if (this.InvokeRequired)
//            {
//                this.BeginInvoke(new JobDoneDelegate(this.JobDone), id, data);
//                return;
//            }

//            base.StringByEvaluatingJavaScriptFromString(string.Format("Async.finishTask('{0}', '{1}')", id, this.ToJSON(data)));
//        }

//        private delegate void JobUpdateDelegate(string id, object data);
//        protected void JobUpdate(string id, object data)
//        {
//            if (this.InvokeRequired)
//            {
//                this.BeginInvoke(new JobUpdateDelegate(this.JobUpdate), id, data);
//                return;
//            }

//            base.StringByEvaluatingJavaScriptFromString(string.Format("Async.updateTask('{0}', '{1}')", id, this.ToJSON(data)));
//        }

//        [DllImport("user32.dll")]
//        public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

//        public const int MOUSEEVENTF_LEFTDOWN = 0x02;
//        public const int MOUSEEVENTF_LEFTUP = 0x04;
//        public const int MOUSEEVENTF_RIGHTDOWN = 0x08;
//        public const int MOUSEEVENTF_RIGHTUP = 0x10;

//        public DialogResult ShowDialog(CommonDialog dialog)
//        {
//            mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

//            return dialog.ShowDialog();
//        }
//    }

//    public delegate object Func();
//}